package com.xbongbong.paas.service.stage;

import com.xbongbong.paas.domain.entity.PaasStageEntity;
import com.xbongbong.paas.field.FieldAttrEntity;
import com.xbongbong.paas.field.ItemPoJo;
import com.xbongbong.paas.pojo.FieldAttrEntityForImport;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.pro.script.pojo.dto.StageSettingScriptDTO;

import java.util.List;
import java.util.Map;

/**
 * 阶段模型底层处理
 * 策略模式
 * @author 李少杰
 * @version v1.0.0
 * @date 2021/11/22 17:37
 */
public interface StageHandle {

    /**
     * 业务类型
     * @return 业务码
     */
    Integer businessType();

    /**
     * 获取阶段
     * @param stageId 阶段id
     * @param corpid 公司id
     * @return PaasStageEntity 阶段实体
     * @throws XbbException exception
     */
    PaasStageEntity getByKey(Long stageId, String corpid) throws XbbException;

    /**
     * 条件查询
     * @param params 查询参数
     * @return 阶段列表
     */
    List<PaasStageEntity> findEntitys(Map<String, Object> params);

    /**
     * 插入
     * @param entity 实体
     * @return 是否成功
     * @throws XbbException 数据库操作异常
     */
    Integer insert(PaasStageEntity entity) throws XbbException;

    /**
     * 更新
     * @param entity 实体
     * @return 是否成功
     * @throws XbbException 数据库操作异常
     */
    Integer update(PaasStageEntity entity) throws XbbException;

    /**
     * 获取符合查询条件的记录总数
     * @param param 查询条件
     * @return 符合查询条件的记录总数
     */
    Integer getEntitysCount(Map<String, Object> param);

    /**
     * 批量删除
     * @param paasStageEntityList 阶段实体列表
     * @param corpid 公司id
     */
    Integer deleteBatch(List<PaasStageEntity> paasStageEntityList, String corpid);

    /**
     * 批量插入
     * @param list 阶段实体列表
     */
    void insertBatch(List<PaasStageEntity> list);

    /**
     * 批量插入 用于上线时脚本初始化
     * @param list 阶段实体列表
     */
    void insertBatch4Script(List<PaasStageEntity> list);

    /**
     * 批量更新
     * @param list 阶段实体列表
     */
    void updateBatch(List<PaasStageEntity> list, String corpid);

    /**
     * 批量更新默认值和选项关联
     * @param list 阶段实体列表
     */
    void updateBatchDefaultAndLinkOption(List<PaasStageEntity> list, String corpid);

    /**
     * 导入模板获取下拉选项
     *
     * @param corpid
     * @param formId
     * @param enable
     * @param stageField
     * @return
     */
    List<ItemPoJo> getItemListForImport(String corpid, Long formId, Integer enable, FieldAttrEntityForImport stageField);

    List<ItemPoJo> getItemList(String corpid, Long formId, Integer enable);

    /**
     * 镜像回退 批量更新
     * @param list 阶段实体列表
     */
    void updateBatch4MirrorRollback(List<PaasStageEntity> list, String corpid);

    /**
     * 批量更新，仅初始化脚本使用
     * @param list 更新的数据
     */
    void updateBatch4Script(List<PaasStageEntity> list);

    /**
     * 通过stageCode获取阶段
     *
     * @param corpid
     * @param formId
     * @param stageCode
     * @return
     */
    PaasStageEntity getByCode(String corpid, Long formId, String stageCode);

    /**
     * 获取指定流程版本的所有阶段信息
     * @param params 参数map
     * @param formId 表单Id
     * @param corpid 公司Id
     **/
    List<ItemPoJo> getStageByStageProgress(Map<String, Object> params, Long formId, String corpid) throws XbbException;

    /**
     * 表单设计页保存时，读取阶段字段的items
     * 从items中获取相关的默认值和选项关联，保存到当前启用的优先级最高的版本阶段上
     * 更新阶段的默认值和选项关联值
     *
     * @param explains
     * @param formId
     * @param corpid
     * @throws XbbException
     */
    void updateStageDefaultAndOption(List<FieldAttrEntity> explains, Long formId, String corpid) throws XbbException;

    /**
     * stage阶段设置页获取时更多操作
     * @param paasStageEntity
     * @param stageVO
     * @param stageSetting com.xbongbong.paas.enums.StageSettingShowEnum
     */
    void stageGetSettingAdvance(PaasStageEntity paasStageEntity, Object stageVO, Integer stageSetting);

    /**
     * stage阶段设置页保存时更多操作
     * @param paasStageEntity
     * @param stageSave
     * @param stageSetting
     */
    void stageSaveSettingAdvance(PaasStageEntity paasStageEntity, Object stageSave, Integer stageSetting);

}
